package Controle;

import Modelo.Usuario;
import Modelo.UsuarioVaga;
import Modelo.Vaga;
import Servico.MovimentacaoService;
import Servico.UsuarioService;
import Servico.VagaService;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.ListDataModel;
import util.FabricaDeObjetos;

public class MovimentacaoMB {

    private static MovimentacaoService movimentacaoService;
    private static UsuarioService usuarioService;
    private static VagaService vagaService;

    static {
        try {
            movimentacaoService = (MovimentacaoService) FabricaDeObjetos.getObjetoUnico(MovimentacaoService.class);

            usuarioService = (UsuarioService) FabricaDeObjetos.getObjetoUnico(UsuarioService.class);

            vagaService = (VagaService) FabricaDeObjetos.getObjetoUnico(VagaService.class);
        } catch (Exception e) {
            Logger.getLogger(MovimentacaoService.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    private UsuarioVaga movimentacaoCorrente;

    private UsuarioVaga movimentacaoConsulta = new UsuarioVaga();

    private Vaga vagaConsulta = new Vaga();

    private Usuario usuarioConsulta = new Usuario();

    private List<UsuarioVaga> resultadoConsulta;

    private List<Usuario> usuarioResultadoConsulta;

    private List<Vaga> vagaResultadoConsulta;

    private ListDataModel movimentacaoListDataModel;

    private ListDataModel usuarioListDataModel;

    private ListDataModel vagaListDataModel;

    public void incluir() {

        try {

            movimentacaoService.incluir(movimentacaoCorrente, usuarioResultadoConsulta, vagaResultadoConsulta);

            addFacesMessage("Movimentacao incluida com sucesso!");

        } catch (Exception e) {
            addFacesMessage(e.getMessage());
        }
    }

    public String prepararInclusao() {
        
        movimentacaoCorrente = new UsuarioVaga();
        
        return "INCLUIR";
    }

    public String voltarInclusao() {
        return "VOLTAR_INCLUSAO";
    }

    public String voltarConsulta() {
        return "VOLTAR_CONSULTA";
    }

    public String consultar() {

        try {

            if (resultadoConsulta == null) {
                resultadoConsulta = new ArrayList<UsuarioVaga>();
            }

            resultadoConsulta =  movimentacaoService.consultar(usuarioConsulta, vagaConsulta, movimentacaoConsulta);

            movimentacaoListDataModel = new ListDataModel(resultadoConsulta);

            return "CONSULTAR";

        } catch (Exception e) {
            addFacesMessage(e.getMessage());
        }

        return null;
        
    }

    public String remover() {

        UsuarioVaga movimentacaoRemover = (UsuarioVaga) movimentacaoListDataModel.getRowData();

        movimentacaoService.remover(movimentacaoRemover);

        resultadoConsulta.remove(movimentacaoRemover);

        addFacesMessage("Movimentacao excluida com sucesso!");

        return "REMOVER";
    }

    public String limparCamposConsulta() {

        movimentacaoConsulta = new UsuarioVaga();
        usuarioConsulta = new Usuario();
        vagaConsulta = new Vaga();

        usuarioResultadoConsulta = new ArrayList<Usuario>();
        usuarioListDataModel = new ListDataModel(usuarioResultadoConsulta);
        vagaResultadoConsulta = new ArrayList<Vaga>();
        vagaListDataModel = new ListDataModel(vagaResultadoConsulta);

        return "LIMPAR";
    }
    
    public void buscarUsuarios() {
        try {
            usuarioResultadoConsulta = usuarioService.consultar(usuarioConsulta);

            usuarioListDataModel = new ListDataModel(usuarioResultadoConsulta);

        } catch (Exception e) {
            addFacesMessage(e.getMessage());
        }
    }

    public void buscarVagas() {
        try {
            vagaResultadoConsulta = vagaService.consultar(vagaConsulta);

            vagaListDataModel = new ListDataModel(vagaResultadoConsulta);
        } catch (Exception e) {
            addFacesMessage(e.getMessage());
        }
    }

    public void addFacesMessage(String message) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message, null));
    }

    private boolean isBlank(String str) {
        return (str == null) || (str.trim().equals(""));
    }

    public UsuarioVaga getMovimentacaoConsulta() {
        return movimentacaoConsulta;
    }

    public void setMovimentacaoConsulta(UsuarioVaga movimentacaoConsulta) {
        this.movimentacaoConsulta = movimentacaoConsulta;
    }

    public UsuarioVaga getMovimentacaoCorrente() {
        return movimentacaoCorrente;
    }

    public void setMovimentacaoCorrente(UsuarioVaga movimentacaoCorrente) {
        this.movimentacaoCorrente = movimentacaoCorrente;
    }

    public ListDataModel getMovimentacaoListDataModel() {
        return movimentacaoListDataModel;
    }

    public void setMovimentacaoListDataModel(ListDataModel movimentacaoListDataModel) {
        this.movimentacaoListDataModel = movimentacaoListDataModel;
    }

    public List<UsuarioVaga> getResultadoConsulta() {
        return resultadoConsulta;
    }

    public void setResultadoConsulta(List<UsuarioVaga> resultadoConsulta) {
        this.resultadoConsulta = resultadoConsulta;
    }

    public Usuario getUsuarioConsulta() {
        return usuarioConsulta;
    }

    public void setUsuarioConsulta(Usuario usuarioConsulta) {
        this.usuarioConsulta = usuarioConsulta;
    }

    public ListDataModel getUsuarioListDataModel() {
        return usuarioListDataModel;
    }

    public void setUsuarioListDataModel(ListDataModel usuarioListDataModel) {
        this.usuarioListDataModel = usuarioListDataModel;
    }

    public Vaga getVagaConsulta() {
        return vagaConsulta;
    }

    public void setVagaConsulta(Vaga vagaConsulta) {
        this.vagaConsulta = vagaConsulta;
    }

    public ListDataModel getVagaListDataModel() {
        return vagaListDataModel;
    }

    public void setVagaListDataModel(ListDataModel vagaListDataModel) {
        this.vagaListDataModel = vagaListDataModel;
    }
}